/**
 * @copyright (c) 2024, MacRsh
 *
 * @license SPDX-License-Identifier: Apache-2.0
 *
 * @date 2024-08-03    MacRsh       First version
 */

#ifndef __VEC_H__
#define __VEC_H__

#include <errno.h>
#include <malloc.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @addtogroup Vec
 * @{
 */

/**
 * @struct Vec
 * @brief Represents a vector.
 */
typedef struct Vec {
    void **data;
    size_t capacity;
    size_t count;
} Vec_t;

int vec_init(Vec_t *vec, size_t capacity);
void vec_deinit(Vec_t *vec);
Vec_t *vec_new(size_t capacity);
void vec_del(Vec_t *vec);
int vec_push(Vec_t *vec, void *data);
void *vec_pop(Vec_t *vec);
int vec_insert(Vec_t *vec, size_t index, void *data);
void *vec_remove(Vec_t *vec, size_t index);
void vec_clear(Vec_t *vec);
void *vec_get(Vec_t *vec, size_t index);
void *vec_first(Vec_t *vec);
void *vec_last(Vec_t *vec);
size_t vec_len(Vec_t *vec);
bool vec_is_empty(Vec_t *vec);
size_t vec_capacity(Vec_t *vec);
int vec_reserve(Vec_t *vec, size_t reserve_size);
int vec_shrink_to(Vec_t *vec, size_t capacity);
int vec_shrink_to_fit(Vec_t *vec);

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __VEC_H__ */
